package main

import "fmt"

/*
给定一个 n×n 的二维矩阵matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
*/

//顺时针旋转90：先沿对角线反转矩阵，再沿竖中轴线反转矩阵；
//顺时针旋转180：先沿横中轴线反转矩阵，再沿竖中轴线反转矩阵；
//顺时针旋转270：先沿对角线反转矩阵，再沿横中轴线反转矩阵；

// 按对角线反转矩阵 \
//for i := range matrix {
//	for j := 0; j < i; j++ {
//		matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
//	}
//}

// 按竖中轴线反转矩阵 |
//for i := range matrix {
//	for j := 0; j < halfLen; j++ {
//		matrix[i][j], matrix[i][idx-j] = matrix[i][idx-j], matrix[i][j]
//	}
//}

// 按横中轴线反转矩阵 一
//for i := 0; i < halfLen; i++ {
//	for j := range matrix[i] {
//		matrix[idx-i][j], matrix[i][j] = matrix[i][j], matrix[idx-i][j]
//	}
//}

func rotate(matrix [][]int) {
	idx, halfLen := len(matrix)-1, len(matrix)/2 // 记录最后一个元素的下标和边长的一半

	for i := range matrix {
		for j := 0; j < i; j++ {
			matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
		}
	}
	for i := range matrix {
		for j := 0; j < halfLen; j++ {
			matrix[i][j], matrix[i][idx-j] = matrix[i][idx-j], matrix[i][j]
		}
	}
}

func main() {
	num := [][]int{{1, 2}, {3, 4}}
	rotate(num)
	fmt.Println(num)
}
